/*
*---------------------------------------------------------------
*                        Lvgl Font Tool                         
*                                                               
* 注:使用unicode编码                                              
* 注:本字体文件由Lvgl Font Tool V0.5测试版 生成                     
* 作者:阿里(qq:617622104)                                         
*---------------------------------------------------------------
*/


#include "lvgl_porting/lv_mount_cus_font.h"


static const uint8_t glyph_bitmap[] = {
/* 上 */
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,  //.............%@@@@@@@@@@@@@@@#..
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,  //.............%@@@@@@@@@@@@@@@#..
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,  //.............%@@@@@@@@@@@@@@@#..
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf4,0x44,0x44,0x44,0x44,0x44,0x43,0x00,  //.............%@@@*************..
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.............%@@@...............
0x24,0x44,0x44,0x44,0x44,0x44,0x4a,0xff,0xf4,0x44,0x44,0x44,0x44,0x44,0x44,0x44,  //+************%@@@***************
0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,  //%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,  //%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,  //%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


/* 海 */
0x00,0x01,0x10,0x00,0x00,0x00,0x01,0xa6,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //...++........+%**................
0x00,0x0c,0xf8,0x10,0x00,0x00,0x06,0xff,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //...#@%+......*@@@+...............
0x00,0xaf,0xff,0xf7,0x00,0x00,0x0b,0xff,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //..%@@@@*.....%@@%................
0x00,0x4c,0xff,0xff,0xd3,0x00,0x2f,0xff,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //..*#@@@@#*..+@@@*................
0x00,0x00,0x5e,0xff,0xfc,0x00,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,  //....*#@@@#..%@@@@@@@@@@@@@@@@@@#.
0x00,0x00,0x01,0x9f,0xf3,0x02,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,  //.....+%@@*.+@@@@@@@@@@@@@@@@@@@#.
0x00,0x00,0x00,0x06,0x60,0x0a,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,  //.......**..%@@@@@@@@@@@@@@@@@@@#.
0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //..........*@@@%..................
0x00,0x00,0x00,0x00,0x00,0xdf,0xff,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //..........#@@@+..................
0x00,0x00,0x00,0x00,0x09,0xff,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  //.........%@@@*...................
0x01,0x00,0x00,0x00,0x6f,0xff,0xce,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40,0x00,  //.+......*@@@##@@@@@@@@@@@@@@@@*..
0x0a,0xe6,0x00,0x00,0x1a,0xff,0x2f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x30,0x00,  //.%#*....+%@@+@@@@@@@@@@@@@@@@@*..
0x6f,0xff,0xd4,0x00,0x00,0x44,0x1f,0xff,0xcc,0xce,0xfc,0xcc,0xcc,0xcf,0xff,0x00,0x00,  //*@@@#*....**+@@@####@######@@@...
0x5d,0xff,0xff,0x91,0x00,0x00,0x4f,0xfe,0x00,0x4f,0xf6,0x00,0x00,0x0f,0xff,0x00,0x00,  //*#@@@@%+....*@@#..*@@*.....@@@...
0x00,0x7f,0xff,0xf8,0x00,0x00,0x4f,0xfc,0x00,0x0a,0xff,0x60,0x00,0x0f,0xff,0x00,0x00,  //..*@@@@%....*@@#...%@@*....@@@...
0x00,0x02,0xcf,0xd0,0x00,0x00,0x8f,0xfa,0x00,0x00,0xaf,0xf6,0x00,0x0f,0xff,0x00,0x00,  //...+#@#.....%@@%....%@@*...@@@...
0x00,0x00,0x09,0x20,0x00,0x00,0x8f,0xf8,0x00,0x00,0x0b,0xf5,0x00,0x0f,0xff,0x00,0x00,  //.....%+.....%@@%.....%@*...@@@...
0x00,0x00,0x00,0x00,0x4f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,  //........*@@@@@@@@@@@@@@@@@@@@@@@%
0x00,0x00,0x00,0x00,0x4f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,  //........*@@@@@@@@@@@@@@@@@@@@@@@%
0x00,0x00,0x03,0xa1,0x4f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,  //.....*%+*@@@@@@@@@@@@@@@@@@@@@@@%
0x00,0x00,0x09,0xfd,0x30,0x01,0xff,0xf0,0x01,0xbf,0x30,0x00,0x00,0x0f,0xff,0x00,0x00,  //.....%@#*..+@@@..+%@*......@@@...
0x00,0x00,0x0f,0xff,0x50,0x04,0xff,0xe0,0x03,0xff,0xf3,0x00,0x00,0x0f,0xff,0x00,0x00,  //.....@@@*..*@@#..*@@@*.....@@@...
0x00,0x00,0x5f,0xff,0x00,0x06,0xff,0xc0,0x00,0x3f,0xff,0x30,0x00,0x4f,0xfd,0x00,0x00,  //....*@@@...*@@#...*@@@*...*@@#...
0x00,0x00,0xaf,0xfa,0x00,0x08,0xff,0xa0,0x00,0x03,0xff,0xf3,0x00,0x4f,0xfc,0x00,0x00,  //....%@@%...%@@%....*@@@*..*@@#...
0x00,0x01,0xff,0xf5,0x00,0x0b,0xff,0x80,0x00,0x00,0x7f,0xf5,0x00,0x4f,0xfc,0x00,0x00,  //...+@@@*...%@@%.....*@@*..*@@#...
0x00,0x07,0xff,0xf0,0x00,0x0d,0xff,0xec,0xcc,0xcc,0xcf,0xec,0xcc,0xdf,0xff,0xcc,0x00,  //...*@@@....#@@#######@#####@@@##.
0x00,0x0e,0xff,0x90,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,  //...#@@%....@@@@@@@@@@@@@@@@@@@@@.
0x00,0x5f,0xff,0x20,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,  //..*@@@+...*@@@@@@@@@@@@@@@@@@@@@.
0x00,0xcf,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xff,0xf3,0x00,0x00,  //..#@@#...................*@@@*...
0x04,0xff,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0xff,0xf0,0x00,0x00,  //.*@@@*...................%@@@....
0x0b,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xac,0xcc,0xdf,0xff,0xa0,0x00,0x00,  //.%@@@...............%####@@@%....
0x02,0xcf,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6f,0xff,0xff,0xff,0x20,0x00,0x00,  //.+#@%...............*@@@@@@@+....
0x00,0x06,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0xff,0xfe,0xa3,0x00,0x00,0x00,  //...*+...............*@@@@#%*.....


};


static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
    {.bitmap_index = 0,	.adv_w = 35, .box_h = 29, .box_w = 32, .ofs_x = 1, .ofs_y = 9},/*(上)*/
    {.bitmap_index = 464,	.adv_w = 35, .box_h = 33, .box_w = 34, .ofs_x = 1, .ofs_y = 7},/*(海)*/
};


static const uint16_t unicode_list_1[] = {
    0x4e0a,	/*(上)*/
    0x6d77,	/*(海)*/
    0x0000,    /*End indicator*/
};


static const lv_font_fmt_txt_cmap_t cmaps[] = {
    {
        .range_start = 0x4e0a,
        .range_length = 0x6d77,
        .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY,
        .glyph_id_start = 0,
        .unicode_list = unicode_list_1,
        .glyph_id_ofs_list = NULL,
        .list_length = 2,
    }
};


static lv_font_fmt_txt_glyph_cache_t glyph_cache;


static lv_font_fmt_txt_dsc_t font_dsc = {
    .glyph_bitmap = glyph_bitmap,
    .glyph_dsc = glyph_dsc,
    .cmaps = cmaps,
    .cmap_num = 1,
    .bpp = 4,

    .kern_scale = 0,
    .kern_dsc = NULL,
    .kern_classes = 0,

    .cache = &glyph_cache,
};


static int binsearch(const uint16_t *sortedSeq, int seqLength, uint16_t keyData) {
    int low = 0, mid, high = seqLength - 1;
    while (low <= high) {
        mid = (low + high)>>1;//右移1位等于是/2，奇数，无论奇偶，有个值就行
        if (keyData < sortedSeq[mid]) {
            high = mid - 1;//是mid-1，因为mid已经比较过了
        }
        else if (keyData > sortedSeq[mid]) {
            low = mid + 1;
        }
        else {
            return mid;
        }
    }
    return -1;
}


static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) {
    lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *) font->dsc;

    if( unicode_letter<fdsc->cmaps[0].range_start || unicode_letter>fdsc->cmaps[0].range_length ) return false;

    int i;
    if( unicode_letter==fdsc->cache->last_letter ){
        i = fdsc->cache->last_glyph_id;
    }
    else{
        i = binsearch(fdsc->cmaps[0].unicode_list, fdsc->cmaps[0].list_length, unicode_letter);
    }
    if( i != -1 ) {
        const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[i];
        fdsc->cache->last_glyph_id = i;
        fdsc->cache->last_letter = unicode_letter;
        return &fdsc->glyph_bitmap[gdsc->bitmap_index];
    }
    return NULL;
}


static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) {
    lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *) font->dsc;

    if( unicode_letter<fdsc->cmaps[0].range_start || unicode_letter>fdsc->cmaps[0].range_length ) return false;

    int i;
    if( unicode_letter==fdsc->cache->last_letter ){
        i = fdsc->cache->last_glyph_id;
    }
    else{
        i = binsearch(fdsc->cmaps[0].unicode_list, fdsc->cmaps[0].list_length, unicode_letter);
    }
    if( i != -1 ) {
        const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[i];
        fdsc->cache->last_glyph_id = i;
        fdsc->cache->last_letter = unicode_letter;
        dsc_out->adv_w = gdsc->adv_w;
        dsc_out->box_h = gdsc->box_h;
        dsc_out->box_w = gdsc->box_w;
        dsc_out->ofs_x = gdsc->ofs_x;
        dsc_out->ofs_y = gdsc->ofs_y;
        dsc_out->bpp   = fdsc->bpp;
        return true;
    }
    return false;
}


//思源黑体 Medium,Medium,26
//字模高度：51
//内部字体
//使用排序和二分查表
const lv_font_t lv_test_font = {
    .dsc = &font_dsc,
    .get_glyph_bitmap = __user_font_get_bitmap,
    .get_glyph_dsc = __user_font_get_glyph_dsc,
    .line_height = 51,
    .base_line = 0,
};

